# 判断一个变量的基本类型
import types
print(type(123))

# 判断一个变量指向函数或者类
print(type(abs))

# 判断一个对象是否是函数


def check():
    pass


# 判断对象是否是函数
print(type(check) == types.FunctionType)
# 判断对象是否是内建函数
print(type(abs) == types.BuiltinFunctionType)
# 判断对象是否是匿名函数
print(type(lambda x: x) == types.LambdaType)
# 判断对象是否是生成器
print(type((x for x in range(10))) == types.GeneratorType)

# TODO 总是优先使用isinstance()做判断

# 获得一个对象的所有属性和方法,通过dir(),返回的是list
print(dir(abs))


# 如果自己写的类需要一个len方法,可以这样写
class Dog(object):
    def __len__(self):
        return 100


# 然后这样调用
dog = Dog()
print(len(dog))

# 判断对象是否有某个属性
print(hasattr(dog, 'length'))
# 对象设置属性
print(setattr(dog, 'name', 'Peppy'))
# 获取对象属性
print(getattr(dog, 'name'))
